//
//  NSNull+LKReplace.m
//  YuxiCloud
//
//  Created by LIUKUN-PC on 17/1/3.
//  Copyright © 2017年 ynnissi. All rights reserved.
//

/**  功能: 防止NSNull对象 调用未识别方法时崩溃
 
 * 在给程序添加消息转发功能以前，必须覆盖两个方法，即methodSignatureForSelector:和forwardInvocation:。
 * methodSignatureForSelector:的作用在于为另一个类实现的消息创建一个有效的方法签名，必须实现，并且返回不为空的methodSignature，否则会crash。
 * forwardInvocation:将选择器转发给一个真正实现了该消息的对象。

 * 参考资料
 * http://www.cnblogs.com/tinkl/p/3696651.html
 * http://www.jianshu.com/p/36b48299989e
 */

#import "NSNull+LKMessageForwarding.h"

@implementation NSNull (LKMessageForwarding)




/** 消息转发 */
- (void)forwardInvocation:(NSInvocation *)invocation {
    
    if ([self respondsToSelector:[invocation selector]]) {
        
        [invocation invokeWithTarget:self];
        
    }
}

/** 方法签名 */

- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
    
    NSMethodSignature *sig = [[NSNull class] instanceMethodSignatureForSelector:selector];
    
    if(sig == nil) {
        
        sig = [NSMethodSignature signatureWithObjCTypes:"@^v^c"];
        
    }
    return sig;
}

@end
